Code
# Chargement des packages et des données
library(tidyverse)
library(magrittr)
library(bibliometrix)
library(ggraph)
#library(tidygraph)
library(tidytext)
library(mixr)
library(bibou)
set.seed(123)Chapitre introductif d’un ouvrage sur la recherche sur le Rhône (20 ans de ZABR-OHM). Création de:
# Chargement des packages et des données
library(tidyverse)
library(magrittr)
library(bibliometrix)
library(ggraph)
#library(tidygraph)
library(tidytext)
library(mixr)
library(bibou)
set.seed(123)Import et nettoyage de la base .bib (exporté depuis Web of Science).
Dans titre ou topic: “Rhone” & “river|basin|catchment”. Filtre ultérieur pour retirer les mentions de Rhone présentes seulement dans les “Keywords +” (issus d’un algorithme de Web of Science reposant en partie sur les références biblio des documents)
if(!file.exists("data/M.RDS")){
bibou::bib_remove_duplicates("data-raw/savedrecs_Rhone.bib")
M=bibliometrix::convert2df(file = "data-raw/savedrecs_Rhone.bib",
dbsource = "isi",
format = "bibtex")
tib_doc=bibou::bib_tib_doc("data-raw/savedrecs_Rhone_clean.bib",
check_in_text="RHONE") %>%
mutate(condition=PY>2018 & str_detect(AU, "ARNAUD F")) %>%
mutate(AU=case_when(condition~str_replace_all(AU,"ARNAUD F","ARNAUD Fa"),
TRUE~AU),
id_doc=case_when(condition~str_replace_all(id_doc,"ARNAUD F","ARNAUD Fa"),
TRUE~id_doc))
saveRDS(M,"data/M.RDS")
saveRDS(tib_doc,"data/tib_doc.RDS")
}
M=readRDS("data/M.RDS")
tib_doc=readRDS("data/tib_doc.RDS")if(!file.exists("data/tib_doc_AU.RDS")){
tib_doc_AU=bibou::bib_tib_doc_AU(tib_doc)
tib_doc_CR=bibou::bib_tib_doc_CR(tib_doc)
tib_doc_DE=bibou::bib_tib_doc_DE(tib_doc)
tib_doc_ABW=bibou::bib_tib_doc_ABW(tib_doc)
saveRDS(tib_doc_AU,"data/tib_doc_AU.RDS")
saveRDS(tib_doc_CR,"data/tib_doc_CR.RDS")
saveRDS(tib_doc_DE,"data/tib_doc_DE.RDS")
saveRDS(tib_doc_ABW,"data/tib_doc_ABW.RDS")
}
tib_doc_AU=readRDS("data/tib_doc_AU.RDS")
tib_doc_CR=readRDS("data/tib_doc_CR.RDS")
tib_doc_DE=readRDS("data/tib_doc_DE.RDS")
tib_doc_ABW=readRDS("data/tib_doc_ABW.RDS")On attribue au \(k\)-ième auteur d’un document qui en compte \(n\) en tout un poids \(w\) de
\[w=(n-k+1)\frac{2}{n(n+1)}\] soit par exemple pour un document qui compte 4 auteurs des poids de 0.4,0.3,0.2 et 0.1 pour le premier, deuxième, troisième et quatrième auteur respectivement.
auteurs=tib_doc_AU %>%
group_by(AU) %>%
summarise(ndoc=n(),
ndocw=sum(AU_weight),
TC=sum(TC),
TCw=sum(TC*AU_weight),
LC=sum(LC),
LCw=sum(LC*AU_weight),.groups="drop")
filterfunction (.data, ..., .by = NULL, .preserve = FALSE)
{
check_by_typo(...)
by <- enquo(.by)
if (!quo_is_null(by) && !is_false(.preserve)) {
abort("Can't supply both `.by` and `.preserve`.")
}
UseMethod("filter")
}
<bytecode: 0x5588ea267978>
<environment: namespace:dplyr>
Le corpus compte 4046 auteurs distincts. Un auteur est associé à en moyenne 1.6950074 documents du corpus. 1024 sont associés à au moins 2 documents, 215 sont associés à au moins 5 documents.
ggplot(auteurs, aes(x=ndoc)) +
geom_bar()
p1=mixr::plot_frequencies(auteurs %>% arrange(desc(ndocw)) %>% head(20),
AU,freq=ndocw)
p2=mixr::plot_frequencies(auteurs %>% arrange(desc(TCw)) %>% head(20),
AU,freq=TCw)
p3=mixr::plot_frequencies(auteurs %>% arrange(desc(LCw)) %>% head(20),
AU,freq=LCw)
ggpubr::ggarrange(p1,p2,p3,nrow=1)
sources=mixr::tidy_frequencies(tib_doc,SO,top_freq=20)Top 100 des articles les plus cités par le corpus:
citations=tib_doc_CR %>%
mixr::tidy_frequencies(CR,top_freq=100)
reactable::reactable(citations,
filterable=TRUE)ggplot(tib_doc,
aes(x=PY))+
geom_bar()+
xlab("année de publication") + ylab("nombre de publications")
if(!file.exists("data-raw/tib_doc_Rhine.RDS")){
for (river in c("Rhine","Rhone","Danube")){
file <- glue::glue("data-raw/savedrecs_{river}_clean.bib")
M <- convert2df(file = file,
dbsource = "isi",
format = "bibtex")
tib_doc=M %>%
rownames_to_column(var="id_doc") %>%
as_tibble() %>%
tidyr::unite(texts,TI,AB,DE,sep="; ",remove=FALSE) %>%
mutate(rightriver=str_detect(texts,toupper(river))) %>%
filter(rightriver) %>%
select(-rightriver,-texts) %>%
unique()
saveRDS(tib_doc,glue::glue("data-raw/tib_doc_{river}.RDS"))
}
}
tib_nb_publ_per_year=
bind_rows(readRDS("data-raw/tib_doc_Rhone.RDS") %>% mutate(river="Rhone") %>% select(river,PY),
readRDS("data-raw/tib_doc_Danube.RDS") %>% mutate(river="Danube") %>% select(river,PY),
readRDS("data-raw/tib_doc_Rhine.RDS") %>% mutate(river="Rhine") %>% select(river,PY)) %>%
mutate(period=cut(PY,breaks=c(1940,2000,2011,2023),dig.lab=4)) %>%
mutate(period=as.factor(period)) %>%
mutate(ntot=n()) %>%
group_by(river) %>%
mutate(ndocriver=n()) %>%
ungroup() %>%
group_by(period) %>%
group_by(PY) %>%
mutate(ndocPY=n()) %>%
ungroup() %>%
mutate(predprop=ntot*(ndocriver/ntot)*(ndocPY/ntot)) %>%
arrange(river,PY) %>%
group_by(river,PY,predprop) %>%
summarise(n=n(),.groups="drop")
ggplot(tib_nb_publ_per_year,
aes(x=PY,y=n))+
geom_path(aes(y=predprop))+
geom_col(alpha=0.5)+
xlab("année de publication")+ylab("nombre de publications")+
facet_grid(rows=vars(river),scales="free_y")+
scale_x_continuous(limits=c(1980,2024))
Quels sont les documents qui font mention des termes SOCIAL/SOCIETY/SOCIO-quelque-chose dans leur abstract?
tib_doc =tib_doc %>%
mutate(mention_SHS=str_detect(AB,"SOCIAL|SOCIETY|SOCIO"))
tib_doc_ABW=tib_doc_ABW %>%
left_join(tib_doc %>%
select(id_doc,mention_SHS),
by="id_doc")
prop_SHS=tib_doc %>%
group_by(mention_SHS) %>%
tally()
prop_SHS# A tibble: 3 × 2
mention_SHS n
<lgl> <int>
1 FALSE 1497
2 TRUE 63
3 NA 91
Peu de documents étiquetés “SHS” a priori (4.04% des documents pour lesquels on dispose de l’abstract) mais ce premier ensemble va nous permettre de rechercher les termes spécifiques aux SHS et d’identifier un “courant SHS” plus important et transverse (cf partie Section 3.1)
On définit des communautés d’auteurs en se basant sur les collaborations (co-signature de documents).
nw_coll_auth <- biblioNetwork(M,
analysis = "collaboration",
network = "authors",
sep = ";")set.seed(12345)
p=networkPlot(nw_coll_auth,
Title = "Collaborations",
type = "fruchterman",
cluster="louvain",
size=5,
size.cex=T,
labelsize=0.5,
label.n=30,
label.cex=F,
alpha=0.5,
#remove.isolates=TRUE,
#edges.min=1,
verbose=FALSE,
community.repulsion=0)auteurs=auteurs %>%
mutate(au=tolower(AU)) %>%
left_join(p$cluster_res,by=c("au"="vertex")) %>%
mutate(cluster=paste0("cluster",str_pad(cluster,4)))
tib_cluster_commus=auteurs %>%
group_by(cluster) %>%
summarise(sum_ndocw=sum(ndocw),
sum_ndoc=sum(ndoc)) %>%
arrange(desc(sum_ndocw)) %>%
mutate(rank=1:n()) %>%
mutate(community=case_when(rank<=12~paste0("c",str_pad(1:n(),pad="0",width=2)),
TRUE~NA_character_))
auteurs=auteurs %>%
left_join(tib_cluster_commus %>%
select(cluster,community),
by="cluster")A ce stade, de nombreuses communautés (auteurs$cluster %>% unique() %>% length()) sont définies. Pour la suite de l’analyse on ne conservera que les communautés à l’origine des 12 plus grands ensembles de documents (ndoc > 145 et ndocw > 30)
Dans le cas où la majorité des auteurs ne fait pas partie d’une communauté définie, on assigne le document à la communauté majoritaire (par exemple si 30% des auteurs font partie de la communauté Cl01 et 70% ne font pas partie d’une communauté définie on assigne le document à la communauté Cl01).
tib_doc_commus=tib_doc_AU %>%
select(id_doc,AU,AU_rank,AU_weight) %>%
left_join(auteurs %>% select(AU,community),by="AU") %>%
group_by(id_doc,community) %>%
summarise(weight=sum(AU_weight,na.rm=TRUE),.groups="drop")
tib_doc_commus=tib_doc %>%
left_join(tib_doc_commus,by=c("id_doc"))tib_commus_prod= tib_doc_commus %>%
group_by(community) %>%
summarise(neqdoc=sum(weight),
ndoc=n())
reactable::reactable(tib_commus_prod,pagination=FALSE)auteurs=auteurs
reactable::reactable(auteurs %>% arrange(community),
groupBy="community",
sortable=TRUE,
filterable=TRUE,
pagination=FALSE,
paginateSubRows=TRUE)reactable::reactable(tib_doc_commus %>% select(-id_doc),
filterable=TRUE,
resizable=TRUE)